package rbac.dao;

import java.util.Collection;
import java.util.List;

import rbac.entity.RbacUser;


/**
 * RBAC DAO 接口, 负责提供<strong>用户</strong>实体与数据库交互的方法..
 * 
 * @author Huadi
 * @author Zoufengyang
 */
public interface UserDao {

	/**
	 * 获取一个用户.
	 * 
	 * @param id
	 *            用户 ID.
	 * @return 相应用户实体. 如果不存在, 返回 <code>null</code>.
	 */
	RbacUser getUser(Integer id);

	/**
	 * 获取一个用户.
	 * 
	 * @param userName
	 *            用户名称.
	 * @return 相应用户实体. 如果不存在, 返回 <code>null</code>.
	 */
	RbacUser getUser(String userName);

	/**
	 * 获取所有用户.
	 * 
	 * @return
	 */
	List<RbacUser> getAllUsers();

	/**
	 * 获取用户.
	 * 
	 * @param userIds
	 *            用户 ID 集合.
	 * @return
	 */
	List<RbacUser> getUsers(Collection<Integer> userIds);

	/**
	 * 持久化用户实体.
	 * 
	 * @param user
	 *            用户实体.
	 */
	void save(RbacUser user);

	/**
	 * 修改用户.
	 * 
	 * @param user
	 *            用户实体.
	 */
	void update(RbacUser user);

	/**
	 * 删除用户.
	 * 
	 * @param user
	 *            用户实体.
	 */
	void delete(RbacUser user);

	/**
	 * 删除用户.
	 * 
	 * @param userId
	 *            用户 ID.
	 */
	void delete(Integer userId);

	/**
	 * 批量编辑一个用户组内的用户, 批量将用户添加或删除进用户组.<br/>
	 * <strong>此方法的设计初衷是减少数据库交互, 会直接操作实体间关系表.<br/>
	 * 且不会检查传入参数, 需确认传入参数的正确.</strong>
	 * 
	 * @param addUserIds
	 *            要添加进此用户组的用户 ID.
	 * @param deleteUserIds
	 *            要从此用户组中删除的用户 ID.
	 * @param userGroupId
	 *            要操作的用户组 ID.
	 */
	void addUsersToUserGroup(Collection<Integer> addUserIds,
			Collection<Integer> deleteUserIds, Integer userGroupId);
}
